package org.apache.rocketmq.example.quickstart.transaction;

import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 事务监听器实现
 */
public class TransactionListenerImpl implements TransactionListener {

    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 本地事务执行器
     */
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        System.out.println("开始执行本地事务...");

        // 情况1：事务执行成功了，直接提交半事务消息。
//        return LocalTransactionState.COMMIT_MESSAGE;

        // 情况2：事务执行失败了，直接回滚半事务消息
//        return LocalTransactionState.ROLLBACK_MESSAGE;

        // 情况3：使用异步操作或者等待很久，返回中间状态 - 交给事务回查来确认结果
        return LocalTransactionState.UNKNOW;
    }

    /**
     * 事务回查执行器 - 当本地事务返回中间状态触发
     * 每隔60s左右重试一次
     */
    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        System.out.println("checkTransaction:" + msg.getTransactionId());
        System.out.println("事务回查..." + format.format(new Date()));

        // 通过查询执行结果或其他方式确认事务执行结果

        // 提交事务
        return LocalTransactionState.COMMIT_MESSAGE;

        // 回滚事务
//        return LocalTransactionState.ROLLBACK_MESSAGE;

        // 还没处理完...
//        return LocalTransactionState.UNKNOW;
    }
}
